<?php

namespace common\factory;

use Yii;
use EasyDingTalk\Robot;
use EasyDingTalk\Application;

class DingtalkFactory
{
    /**
     * 创建实例
     *
     * @param array $params
     * @return Application
     */
    public static function createApp(array $params = [])
    {

        $config = [
            /*
            |-----------------------------------------------------------
            | 【必填】企业 corpId
            |-----------------------------------------------------------
            */
            'corp_id' => '',

            /*
            |-----------------------------------------------------------
            | 【必填】应用 AppKey
            |-----------------------------------------------------------
            */
            'app_key' => '',

            /*
            |-----------------------------------------------------------
            | 【必填】应用 AppSecret
            |-----------------------------------------------------------
            */
            'app_secret' => '',

            /*
            |-----------------------------------------------------------
            | 【选填】加解密
            |-----------------------------------------------------------
            | 此处的 `token` 和 `aes_key` 用于事件通知的加解密
            | 如果你用到事件回调功能，需要配置该两项
            */
            'token' => '',
            'aes_key' => '',

            /*
            |-----------------------------------------------------------
            | 【选填】后台免登配置信息
            |-----------------------------------------------------------
            | 如果你用到应用管理后台免登功能，需要配置该项
            */
            'sso_secret' => '',

            /*
            |-----------------------------------------------------------
            | 【选填】第三方网站 OAuth 授权
            |-----------------------------------------------------------
            | 如果你用到扫码登录、钉钉内免登和密码登录第三方网站，需要配置该项
            */
            'oauth' => [
                /*
                |-------------------------------------------
                 | `app-01` 为你自定义的名称，不要重复即可
                 |-------------------------------------------
                 | 数组内需要配置 `client_id`, `client_secret`, `scope` 和 `redirect` 四项
                 |
                 | `client_id` 为钉钉登录应用的 `appId`
                 | `client_secret` 为钉钉登录应用的 `appSecret`
                 | `scope`:
                 |     - 扫码登录第三方网站和密码登录第三方网站填写 `snsapi_login`
                 |     - 钉钉内免登第三方网站填写 `snsapi_auth`
                 | `redirect` 为回调地址
                 */
                'app-01' => array(
                    'client_id' => Yii::$app->params['dingtalk.login.appid'],
                    'client_secret' => Yii::$app->params['dingtalk.login.secret'],
                    'scope' => 'snsapi_login',
                    'redirect' => $params['redirect'] ?? Yii::$app->params['api_url'].'/v1/dingtalk/userinfo',
                ),
            ]
        ];

        $app = new Application($config);

        return $app;
    }

    /**
     * 实例化机器人
     *
     * @param string $accessToken 钉钉access_token
     * @param string|null $secret 密钥【加签】
     * @return Robot
     */
    public static function createRobot(string $accessToken = '', ?string $secret = null)
    {
        $accessToken = $accessToken ?: '';
        $secret = $secret ?: null;

        return new Robot($accessToken, $secret);
    }
}
